Amazon Aurora DSQLのUser Guideに沿ってNode.jsで基本的な操作を試してみた

Amazon Aurora DSQLのUser Guideに沿ってNode.jsで基本的な操作を試してみた

Amazon Aurora DSQLの簡単な動作を、ユーザーガイドに沿って試してみました。
Clock Icon2024.12.04

はじめに

AWS re:Invent2024にて、新サービス「Amazon Aurora DSQL」が発表されました。

https://aws.amazon.com/about-aws/whats-new/2024/12/amazon-aurora-dsql-preview/

初めて利用するので、ユーザーガイドに沿ってAmazon Aurora DSQLのリソース作成を行い、Lambda(Node.js)で基本的な操作をするところまで記事にしてみようと思います。
同じように「とりあえず動かしてみようかな」という方の参考になれば幸いです!

クラスターを作成する

ユーザーガイドに沿ってクラスターを作成していきます。

https://docs.aws.amazon.com/aurora-dsql/latest/userguide/getting-started.html

マネジメントコンソールに入り、バージニア北部リージョンに切り替えてクラスターを作成します。

image-1.png

デフォルト設定のまま、クラスターを作成します。

image-1.png

作成完了までしばらくかかります。
これでクラスター作成の作業は完了です。

実装の紹介

今回のコードはGitHubで公開しています。

https://github.com/engineer-taro/dsql-node-postgres

Lambdaの実装(Typescript)

ユーザーガイドに沿って、実装を行います。
※今回はAWS CDKで構築しましたが、Lambdaを手動で作成してコーディングでも問題ありません。

https://docs.aws.amazon.com/aurora-dsql/latest/userguide/SECTION_program-with-nodejs.html

ユーザーガイドに沿って実装しましたが、少し修正しているところもあります。コメントで紹介していきます。

import { DsqlSigner } from "@aws-sdk/dsql-signer";
import { Client } from "pg"; // ⭐️インポートの方法を修正しました
let client: Client; // ⭐️clientを使い回すためにhandler外に出しました


export async function handler() {
  const region = "us-east-1";
  try {
    const CLUSTER_ENDPOINT = process.env.CLUSTER_ENDPOINT || ''; // ⭐️Lambdaの環境変数にエンドポイントを設定するように修正しました

    // The token expiration time is optional, and the default value 900 seconds
    const signer = new DsqlSigner({
      hostname: CLUSTER_ENDPOINT,
      region,
    });
    const token = await signer.getDbConnectAdminAuthToken();
    client = new Client({
      host: CLUSTER_ENDPOINT,
      user: "admin",
      password: token,
      database: "postgres",
      port: 5432,
      // <https://node-postgres.com/announcements> for version 8.0
      ssl: true
    });

    // Connect
    await client.connect();

    // Create a new table
    await client.query(`CREATE TABLE IF NOT EXISTS owner (
      id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
      name VARCHAR(30) NOT NULL,
      city VARCHAR(80) NOT NULL,
      telephone VARCHAR(20)
    )`);

    // Insert some data
    await client.query("INSERT INTO owner(name, city, telephone) VALUES($1, $2, $3)", 
      ["John Doe", "Anytown", "555-555-1900"]
    );

    // Check that data is inserted by reading it back
    const result = await client.query("SELECT id, city FROM owner where name='John Doe'");
    console.log({id: result.rows[0].id}); // ⭐️確認のためログを出しています

    await client.query("DELETE FROM owner where name='John Doe'");
    const deletedResult = await client.query("SELECT id, city FROM owner where name='John Doe'");
    console.log({deletedResult});  // ⭐️確認のためログを出しています

  } catch (error) {
    console.error(error);
    throw error
  } finally {
    client?.end()
  }
  Promise.resolve()
}

インフラの実装(AWS CDK)

CDKのコードを紹介します。

import * as cdk from 'aws-cdk-lib';
import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs';
import * as iam from 'aws-cdk-lib/aws-iam';
import { Construct } from 'constructs';

export class DsqlNodePostgresStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);
    // NOTE: DSQL Clusterは手動で別途定義している

    // Lambda -> DSQLのIAMロールを作成
    const role = new iam.Role(this, 'DsqlSampleRole', {
      assumedBy: new iam.ServicePrincipal('lambda.amazonaws.com'),
    });
    // 本番運用の際は権限を絞る
    role.addManagedPolicy(iam.ManagedPolicy.fromAwsManagedPolicyName('AmazonAuroraDSQLFullAccess'));
    
    // Lambdaを定義
    new NodejsFunction(this, 'DsqlSampleFunction', {
      entry: 'lambda/handler.ts',
      environment: {
        CLUSTER_ENDPOINT: "<INSERT_YOUR_ENDPOINT>"
      }
    });
  }
}
    // Lambda -> DSQLのIAMロールを作成
    const role = new iam.Role(this, 'DsqlSampleRole', {
      assumedBy: new iam.ServicePrincipal('lambda.amazonaws.com'),
    });
    role.addManagedPolicy(iam.ManagedPolicy.fromAwsManagedPolicyName('AmazonAuroraDSQLFullAccess'));

DSQLクラスターへの権限が必要なので、IAMロールを定義してLambdaに付与しています。

実行結果

以下のようにログが出力されています。

image-1.png

SELECT, INSERT, DELETEの処理が問題なく実行できていることが無事に確認できました。

感想

簡単ではありますが、新サービス Aurora DSQLの動作を確認してみました。
やっぱり、新サービスを実際に触ってみるのは楽しいですね。
今回の検証を糧に、応用的な検証もしていきたいと思います!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.